# 引入Redis
from redis import Redis
# 引入配置项
from src.setting import CACHE
# 引入json模块，处理列表中只能存放字符串的问题
import json
# 引入MongoDB当中video集合模型
from src.models import videoModel
# 建立redis类
class Cache:
    def __init__(self):
        self.r = Redis(host=CACHE['redis']['HOST'],port=CACHE['redis']['PORT'],db=CACHE['redis']['DB'],decode_responses=True)
    # 插入首页数据
    def getVList(self):
        # 查询redis的数据库中是否存在vlist数据
        v= self.r.lrange('vlist',0,-1)
        self.r.close() # 关闭redis连接，防止连接太多次导致权限拒绝
        if v:
        # 如果有，则转换该数据为数组输出
            vlist = [json.loads(a) for a in v]
            return vlist
        # 如果没有，则查询数据库，存放至Redis数据库中，并输出为数组
        else:
            return self.setVList()
       
    # 将数据存入redis
    def setVList(self):
        self.r.delete('vlist') # 可能有多次保存，所以每次保存直接清空
        # 查询mongodb数据库，将结果存放至Redis数据库中
        vlist = videoModel.find()
        # vv = [json.dumps(v) for v in vlist]
        vv= []
        for v in vlist:
            v['_id'] = str(v['_id'])
            v['vfileid'] = str(v['vfileid'])
            v['vimgid'] = str(v['vimgid'])
            vv.append(json.dumps(v))
        if not vv: raise ValueError("数据为空")
        self.r.rpush('vlist',*vv) # 将数组存放列表
        self.r.expire('vlist',86400) # 给vlist添加生存周期，防止长期存储浪费空间或数据不新鲜
        self.r.close()
        return vlist
# 对象实例化
ModelCache = Cache()